package com.shexianyu.simple;

/**
 * 520. 检测大写字母
 * 我们定义，在以下情况时，单词的大写用法是正确的：
 * 全部字母都是大写，比如 "USA" 。
 * 单词中所有字母都不是大写，比如 "leetcode" 。
 * 如果单词不只含有一个字母，只有首字母大写， 比如 "Google" 。
 * 给你一个字符串 word 。如果大写用法正确，返回 true ；否则，返回 false 。
 * <p>
 * 示例 1：
 * 输入：word = "USA"
 * 输出：true
 * 示例 2：
 * <p>
 * 输入：word = "FlaG"
 * 输出：false
 * <p>
 * 提示：
 * 1 <= word.length <= 100
 * word 由小写和大写英文字母组成
 */
public class DetectCapitalUse {

    /**
     * 思路和算法
     *
     * 根据题目要求，若单词的大写用法正确，则需要满足：
     * 若第 1 个字母为大写，则其他字母必须均为大写或均为小写，即其他字母必须与第 2 个字母的大小写相同；
     * 若第 1 个字母为小写，则其他字母必须均为小写。
     *
     * 根据以上规则，可以整理得到以下更简单的判断规则：
     * 无论第 1 个字母是否大写，其他字母必须与第 22 个字母的大小写相同；
     * 若第 1 个字母为小写，则需额外判断第 2 个字母是否为小写。
     * 正则表达式处理
     * ^      匹配输入字符串开始的位置
     * $      匹配输入字符串结尾的位置
     * x|y    匹配 x 或 y
     * [a-z]  字符范围：匹配指定范围内的任何字符
     * *      零次或多次匹配前面的字符或子表达式
     * +      一次或多次匹配前面的字符或子表达式
     *
     * @param word
     * @return
     */
    public static boolean detectCapitalUse(String word) {
        // ^[A-Z]+$ 全是大写字母
        // ^[A-Z][a-z]*$ 大写字母开头
        // ^[a-z]+$  全是小写字母
        return word.matches("^[A-Z]+$|^[A-Z][a-z]*$|^[a-z]+$");
    }

    public static void main(String[] args) {
        System.out.println(detectCapitalUse("AaC"));
    }
}
